home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 43 / Amiga Format CD43 (1999)(Future Publishing)(GB)(Track 1 of 2)[!][issue 1999-09].iso / -serious- / archivers / xfd / developer / sources / asm / isc.a < prev    next >
Text File  |  1999-06-14  |  10KB  |  467 lines

  1. * Programmheader
  2. *
  3. *    Name:        ISC
  4. *    Author:        SDI
  5. *    Distribution:    PD
  6. *    Description:    XFD external decruncher for recognising ISC
  7. *    Compileropts:    -
  8. *    Linkeropts:    -
  9. *
  10. * 1.0   31.05.98 : first version
  11.  
  12. **************
  13. *
  14. * As there is no way to determine the file size before uncrunching, this
  15. * external always uses double input size as decrunch buffer. Source files
  16. * larger than this cannot be decrunched, but should not crash the file, as
  17. * for every write the current buffer state is checked.
  18. *
  19. ************** 
  20.  
  21.  
  22.         INCLUDE    "AINCLUDE:IncDirs.i"
  23.         INCLUDE    "lvo.i"
  24.  
  25.         INCLUDE    "libraries/xfdmaster.i"
  26.         INCLUDE "exec/memory.i"
  27.  
  28.         * head function for tests
  29. *        INCLUDE    "xfdExeHead.a"
  30.  
  31. ForeMan        MOVEQ    #-1,D0
  32.         RTS
  33.  
  34.         DC.L    XFDF_ID
  35.         DC.W    1,0
  36.         DC.L    0,0,Slave1
  37.  
  38.         DC.B    "$VER: ISC 1.0 (31.05.1998) by SDI",0
  39. N_ISCPass1    DC.B    'ISC1.5 Normal    (Pass1)',0
  40. N_ISCPass2    DC.B    'ISC1.5 Comparer  (Pass2)',0
  41. N_ISCPass3    DC.B    'ISC1.5 Bitstream (Pass3)',0
  42.         EVEN
  43.  
  44. Slave1        DC.L    Slave2        ;no more slaves
  45.         DC.W    2        ;version
  46.         DC.W    36        ;master version
  47.         DC.L    N_ISCPass1    ;name
  48.         DC.W    XFDPFF_ADDR    ;flags
  49.         DC.W    0
  50.         DC.L    RB_Pass1    ;recog buffer
  51.         DC.L    DB_Pass1    ;decrunch buffer
  52.         DC.L    0        ;recog segment
  53.         DC.L    0        ;decrunch segment
  54.         DC.W    0,0
  55.         DC.L    $104        ;MinBufSize
  56.  
  57. Slave2        DC.L    Slave3        ;no more slaves
  58.         DC.W    2        ;version
  59.         DC.W    36        ;master version
  60.         DC.L    N_ISCPass2    ;name
  61.         DC.W    XFDPFF_ADDR    ;flags
  62.         DC.W    0
  63.         DC.L    RB_Pass2    ;recog buffer
  64.         DC.L    DB_Pass2    ;decrunch buffer
  65.         DC.L    0        ;recog segment
  66.         DC.L    0        ;decrunch segment
  67.         DC.W    0,0
  68.         DC.L    $198        ;MinBufSize
  69.  
  70. Slave3        DC.L    0        ;no more slaves
  71.         DC.W    2        ;version
  72.         DC.W    36        ;master version
  73.         DC.L    N_ISCPass3    ;name
  74.         DC.W    XFDPFF_ADDR    ;flags
  75.         DC.W    0
  76.         DC.L    RB_Pass3    ;recog buffer
  77.         DC.L    DB_Pass3    ;decrunch buffer
  78.         DC.L    0        ;recog segment
  79.         DC.L    0        ;decrunch segment
  80.         DC.W    0,0
  81.         DC.L    $104        ;MinBufSize
  82.  
  83. *************************************************************************
  84. *    Recog buffer function: receives buffer + length in A0/D0    *
  85. *************************************************************************
  86.  
  87. RB_Pass1    MOVEQ    #0,D0            ; False
  88.  
  89.         CMP.L    #$000003F3,(A0)
  90.         BNE.B    .No
  91.         CMP.L    #$4FF90000,$2C(A0)
  92.         BNE.B    .No
  93.         CMP.L    #$B7C866FA,$78(A0)
  94.         BNE.B    .No
  95.         CMP.L    #$13C000DF,$8C(A0)
  96.         BNE.B    .No
  97.         CMP.L    #$0008D7C1,$A0(A0)
  98.         BNE.B    .No
  99.         CMP.L    #$D60251C8,$F0(A0)
  100.         BNE.B    .No
  101.         MOVEQ    #1,D0            ; True
  102. .No        RTS
  103.  
  104. RB_Pass2    MOVEQ    #0,D0            ; False
  105.  
  106.         CMP.L    #$000003F3,(A0)
  107.         BNE.B    .No
  108.         CMP.L    #$4EF90000,$64(A0)
  109.         BNE.B    .No
  110.         CMP.L    #$2323B7C8,$78(A0)
  111.         BNE.B    .No
  112.         CMP.L    #$00C80880,$8C(A0)
  113.         BNE.B    .No
  114.         CMP.L    #$60027202,$DC(A0)
  115.         BNE.B    .No
  116.         CMP.L    #$72036002,$F0(A0)
  117.         BNE.B    .No
  118.         MOVEQ    #1,D0            ; True
  119. .No        RTS
  120.  
  121. RB_Pass3    MOVEQ    #0,D0            ; False
  122.  
  123.         CMP.L    #$000003F3,(A0)
  124.         BNE.B    .No
  125.         CMP.L    #$51C9FFFC,$78(A0)
  126.         BNE.B    .No
  127.         CMP.L    #$DBC0D3C0,$B4(A0)
  128.         BNE.B    .No
  129.         CMP.L    #$660E13C0,$C8(A0)
  130.         BNE.B    .No
  131.         CMP.L    #$B0341000,$DC(A0)
  132.         BNE.B    .No
  133.         CMP.L    #$65DED035,$E0(A0)
  134.         BNE.B    .No
  135.         MOVEQ    #1,D0            ; True
  136. .No        RTS
  137.  
  138. *************************************************************************
  139. *    Decrunch buffer function: receives xfdbiBufferInfo in A0    *
  140. *************************************************************************
  141.  
  142. DB_Pass1    MOVE.L    D2,-(A7)
  143.         MOVEQ    #1,D2
  144.         BSR.B    DB_ISC
  145.         MOVE.L    (A7)+,D2
  146.         RTS
  147.         
  148. DB_Pass2    MOVE.L    D2,-(A7)
  149.         MOVEQ    #2,D2
  150.         BSR.B    DB_ISC
  151.         MOVE.L    (A7)+,D2
  152.         RTS
  153.  
  154. DB_Pass3    MOVE.L    D2,-(A7)
  155.         MOVEQ    #3,D2
  156.         BSR.B    DB_ISC
  157.         MOVE.L    (A7)+,D2
  158.         RTS
  159.  
  160. DB_ISC        MOVEM.L    D3-D7/A2-A6,-(A7)
  161.         MOVE.L    A0,A5
  162.  
  163.         MOVEA.L    xfdbi_SourceBufLen(A5),D0
  164.         LSL.L    #1,D0                * double input buf
  165.         MOVE.L    D0,xfdbi_TargetBufLen(A5)
  166.         MOVE.L    xfdbi_TargetBufMemType(A5),D1
  167.         MOVE.L    4.W,A6
  168.         JSR    _LVOAllocMem(A6)
  169.         MOVE.W    #XFDERR_NOMEMORY,xfdbi_Error(A5)
  170.         MOVE.L    D0,xfdbi_TargetBuffer(A5)
  171.         BEQ.B    .NoMem
  172.  
  173.         MOVEA.L    xfdbi_SourceBuffer(A5),A0
  174.         MOVEA.L    D0,A2                * destination
  175.         MOVEA.L    A2,A4                * testpointer
  176.         ADDA.L    xfdbi_TargetBufLen(A5),A4
  177.  
  178.         SUBQ.L    #1,D2        * Pass1 ?
  179.         BNE.B    .doP2
  180.         MOVE.L    $22(A0),xfdbi_DecrAddress(A5)
  181.         MOVE.L    $88(A0),xfdbi_JmpAddress(A5)
  182.         LEA    $104(A0),A1
  183.         BSR.B    DecrunchPass1
  184.         BRA.B    .ok
  185.  
  186. .doP2        SUBQ.L    #1,D2        * Pass2 ?
  187.         BNE.B    .doP3
  188.         MOVE.L    $22(A0),xfdbi_DecrAddress(A5)
  189.         MOVE.L    $11A(A0),xfdbi_JmpAddress(A5)
  190.         LEA    $198(A0),A1
  191.         BSR.W    DecrunchPass2
  192.         BRA.B    .ok
  193.  
  194. .doP3                    * Pass3
  195.         MOVE.L    $28(A0),xfdbi_DecrAddress(A5)
  196.         MOVE.L    $100(A0),xfdbi_JmpAddress(A5)
  197.         LEA    $104(A0),A1
  198.         MOVE.L    $14(A0),D2
  199.         LSL.L    #2,D2
  200.         ADD.L    A0,D2
  201.         SUB.L    #$205,D0            * buffer end ptr
  202.         BSR.W    DecrunchPass3
  203.         
  204. .ok        TST.L    D0
  205.         BEQ.B    .NoMem
  206.         CLR.W    xfdbi_Error(A5)
  207.         MOVE.L    D0,xfdbi_TargetBufSaveLen(A5)
  208.         MOVEQ    #1,D0
  209. .NoMem        MOVEM.L    (A7)+,D3-D7/A2-A6
  210.         RTS
  211.  
  212. *************************************************************************
  213. *    decrunch routine - copied from file (a bit modified)        *
  214. *************************************************************************
  215.  
  216. * A4 - destination end (for test)
  217. * A2 - destination
  218. * A1 - source
  219. * uses D0,D1,D2,D3,D6,A1,A2,A3
  220.  
  221. DecrunchPass1    CLR.L    D0
  222.         CLR.L    D1
  223.         MOVE.B    (A1)+,D0
  224.         BNE.B    .Pass1_01
  225. .ok        SUBA.L    xfdbi_TargetBuffer(A5),A2
  226.         MOVE.L    A2,D0
  227.         RTS
  228.  
  229. .DecrErr    CLR.L    D0
  230.         RTS
  231.  
  232. .Pass1_01    MOVE.B    D0,D1
  233.         ANDI.B    #$001F,D0
  234.         ANDI.B    #-$0020,D1
  235.         LSR.B    #4,D1
  236.         LEA    .Pass1_02(PC),A3
  237.         ADDA.L    D1,A3
  238.         JSR    (A3)
  239.         BRA.B    DecrunchPass1
  240. .Pass1_02    BRA.B    .Pass1_06
  241.         BRA.B    .Pass1_14
  242.         BRA.B    .Pass1_10
  243.         BRA.B    .Pass1_11
  244.         BRA.B    .Pass1_04
  245.         BRA.B    .Pass1_03
  246.         BRA.B    .Pass1_15
  247.         CLR.B    D1
  248.         BRA.B    .Pass1_05
  249. .Pass1_03    LSL.W    #8,D0
  250.         MOVE.B    (A1)+,D0
  251. .Pass1_04    MOVE.B    (A1)+,D1
  252. .Pass1_05    CMP.L    A2,A4        * buffer overflow ?
  253.         BEQ.B    .DecrErr
  254.         MOVE.B    D1,(A2)+
  255.         DBRA    D0,.Pass1_05
  256.         RTS    
  257. .Pass1_06    MOVE.B    (A1)+,D1
  258. .Pass1_07    CLR.L    D6
  259. .Pass1_08    CMP.L    A2,A4        * buffer overflow ?
  260.         BEQ.B    .DecrErr
  261.         MOVE.B    (A1,D6.W),(A2)+
  262.         ADDQ.B    #1,D6
  263.         CMP.B    D6,D0
  264.         BNE.B    .Pass1_08
  265.         DBRA    D1,.Pass1_07
  266. .Pass1_09    MOVE.B    (A1)+,D0
  267.         SUBQ.B    #1,D6
  268.         BNE.B    .Pass1_09
  269.         RTS    
  270. .Pass1_10    MOVE.B    #1,D2
  271.         BRA.B    .Pass1_12
  272. .Pass1_11    MOVE.B    (A1)+,D2
  273. .Pass1_12    MOVE.B    (A1)+,D3
  274. .Pass1_13    CMP.L    A2,A4        * buffer overflow ?
  275.         BEQ.B    .DecrErr
  276.         MOVE.B    D3,(A2)+
  277.         ADD.B    D2,D3
  278.         DBRA    D0,.Pass1_13
  279.         RTS    
  280. .Pass1_14    LSL.W    #8,D0
  281.         MOVE.B    (A1)+,D0
  282. .Pass1_15    CMP.L    A2,A4        * buffer overflow ?
  283.         BEQ.B    .DecrErr
  284.         MOVE.B    (A1)+,(A2)+
  285.         DBRA    D0,.Pass1_15
  286.         RTS
  287.  
  288. *************************************************************************
  289. *    decrunch routine - copied from file (a bit modified)        *
  290. *************************************************************************
  291.  
  292. * A4 - destination end (for test)
  293. * A2 - destination
  294. * A1 - source
  295. * uses D0,D1,D2,D6,D7,A0,A1,A2,A3
  296.  
  297. DecrunchPass2    LEA    .Pass2_07(PC),A3
  298.         CLR.L    D6
  299.         CLR.L    D7
  300. .Pass2_01    CLR.L    D0
  301.         CLR.L    D1
  302.         BSR.W    .Pass2_26
  303.         BCLR    #3,D0
  304.         BNE.B    .Pass2_06
  305.         BCLR    #2,D0
  306.         BNE.B    .Pass2_02
  307.         BSR.B    .Pass2_16
  308.         CLR.L    D1
  309.         TST.W    D0
  310.         BNE.W    .Pass2_33
  311.  
  312.         SUBA.L    xfdbi_TargetBuffer(A5),A2
  313.         MOVE.L    A2,D0
  314.         RTS
  315.  
  316. .DecrErr    CLR.L    D0
  317.         RTS
  318.  
  319. .Pass2_02    MOVE.W    D0,D1
  320. .Pass2_03    BSR.W    .Pass2_24
  321.         CMP.L    A2,A4        * buffer overflow ?
  322.         BEQ.B    .DecrErr
  323.         MOVE.B    D0,(A2)+
  324.         DBRA    D1,.Pass2_03
  325.         BRA.B    .Pass2_01
  326. .Pass2_04    LSL.W    #8,D0
  327.         BSR.B    .Pass2_24
  328. .Pass2_05    ADDQ.W    #4,D0
  329.         BRA.B    .Pass2_02
  330. .Pass2_06    MOVE.B    D0,D1
  331.         BSR.W    .Pass2_26
  332.         LSL.B    #1,D1
  333.         JMP    (A3,D1.W)
  334. .Pass2_07    BRA.B    .Pass2_05
  335.         BRA.B    .Pass2_04
  336.         BRA.B    .Pass2_23
  337.         BRA.B    .Pass2_10
  338.         BRA.B    .Pass2_20
  339.         BRA.B    .Pass2_21
  340.         BRA.B    .Pass2_22
  341.         BCLR    #3,D0
  342.         BEQ.B    .Pass2_08
  343.         MOVEQ    #1,D1
  344.         BRA.B    .Pass2_09
  345. .Pass2_08    MOVEQ    #2,D1
  346. .Pass2_09    BSR.B    .Pass2_16
  347.         BRA.B    .Pass2_19
  348. .Pass2_10    BCLR    #3,D0
  349.         BEQ.B    .Pass2_13
  350.         BCLR    #2,D0
  351.         BEQ.B    .Pass2_11
  352.         MOVEQ    #3,D1
  353.         BRA.B    .Pass2_12
  354. .Pass2_11    MOVEQ    #2,D1
  355. .Pass2_12    BSR.B    .Pass2_14
  356.         BRA.B    .Pass2_19
  357. .Pass2_13    BCLR    #2,D0
  358.         BNE.B    .Pass2_18
  359.         BSR.B    .Pass2_16
  360.         BRA.B    .Pass2_29
  361. .Pass2_14    LSL.W    #8,D0
  362. .Pass2_15    BSR.B    .Pass2_24
  363. .Pass2_16    LSL.L    #8,D0
  364.         BSR.B    .Pass2_24
  365.         RTS    
  366. .Pass2_18    BSR.B    .Pass2_16
  367.         ADDI.W    #$0800,D0
  368.         MOVEQ    #1,D1
  369. .Pass2_19    BRA.B    .Pass2_33
  370. .Pass2_20    MOVE.B    D0,D1
  371.         BSR.B    .Pass2_15
  372.         BRA.B    .Pass2_32
  373. .Pass2_21    BSR.B    .Pass2_16
  374.         BRA.B    .Pass2_30
  375. .Pass2_22    MOVE.B    D0,D1
  376.         BSR.B    .Pass2_24
  377.         BRA.B    .Pass2_32
  378. .Pass2_23    BRA.B    .Pass2_28
  379. .Pass2_24    TST.B    D7
  380.         BNE.B    .Pass2_25
  381.         MOVE.B    (A1)+,D0
  382.         RTS    
  383. .Pass2_25    MOVE.B    D6,D0
  384.         LSL.B    #4,D0
  385.         MOVE.B    (A1)+,D6
  386.         MOVE.B    D6,D5
  387.         LSR.B    #4,D5
  388.         OR.B    D5,D0
  389.         ANDI.B    #$000F,D6
  390.         RTS    
  391. .Pass2_26    TST.B    D7
  392.         BNE.B    .Pass2_27
  393.         MOVEQ    #1,D7
  394.         MOVE.B    (A1)+,D6
  395.         MOVE.B    D6,D0
  396.         ANDI.B    #$000F,D6
  397.         LSR.B    #4,D0
  398.         RTS    
  399. .Pass2_27    CLR.L    D7
  400.         MOVE.B    D6,D0
  401.         RTS    
  402. .Pass2_28    BSR.B    .Pass2_14
  403.         BCLR    #$0013,D0
  404.         BEQ.B    .Pass2_30
  405. .Pass2_29    MOVE.L    D0,D2
  406.         BSR.B    .Pass2_15
  407.         BRA.B    .Pass2_31
  408. .Pass2_30    MOVE.L    D0,D2
  409.         CLR.L    D0
  410.         BSR.B    .Pass2_24
  411. .Pass2_31    MOVE.W    D0,D1
  412.         MOVE.L    D2,D0
  413. .Pass2_32    ADDQ.L    #1,D1
  414. .Pass2_33    MOVEA.L    A2,A0
  415.         SUBA.L    D0,A0
  416.         ADDQ.W    #1,D1
  417. .Pass2_34    CMP.L    A2,A4        * buffer overflow ?
  418.         BEQ.W    .DecrErr
  419.         MOVE.B    (A0)+,(A2)+
  420.         DBRA    D1,.Pass2_34
  421.         BRA.W    .Pass2_01
  422.  
  423. *************************************************************************
  424. *    decrunch routine - copied from file (a bit modified)        *
  425. *************************************************************************
  426.  
  427. * A4 - destination end (for test)
  428. * A2 - destination
  429. * A1 - source
  430. * D2 - source buffer end
  431. * uses D0,D1.W,D2,D4.B,A0,A1,A2,A3
  432.  
  433. DecrunchPass3    MOVEQ    #$E,D0
  434.         MOVE.B    #$80,D4
  435.         LEA    $100(A1),A6
  436.         MOVEA.L    A6,A0
  437.         ADDA.L    D0,A0
  438.         MOVE.L    A0,A3
  439.         ADDA.L    D0,A3
  440. .Pass3_01    CLR.L    D0
  441.         MOVE.W    #$00FF,D1
  442. .Pass3_02    ADDQ.B    #1,D1
  443.         LSL.B    #1,D4
  444.         BNE.B    .Pass3_04
  445.         MOVE.B    (A3)+,D4
  446.         BNE.B    .Pass3_03
  447.         CMPA.L    D2,A3        * reached end
  448.         BCC.B    .ok
  449. .Pass3_03    ROXL.B    #1,D4
  450. .Pass3_04    ROXL.B    #1,D0
  451.         CMP.B    (A6,D1.W),D0
  452.         BCS.B    .Pass3_02
  453.         ADD.B    (A0,D1.W),D0
  454.         CMP.L    A2,A4        * buffer overflow ?
  455.         BEQ.B    .DecrErr
  456.         MOVE.B    (A1,D0.W),(A2)+
  457.         BRA.B    .Pass3_01
  458.  
  459. .DecrErr    CLR.L    D0
  460.         RTS
  461.  
  462. .ok        SUBA.L    xfdbi_TargetBuffer(A5),A2
  463.         MOVE.L    A2,D0
  464.         RTS
  465.  
  466.         END
  467.